package com.itxiaowu.security;

import com.alibaba.dubbo.config.annotation.Reference;
import com.google.gson.Gson;
import com.itxiaowu.pojo.Permission;
import com.itxiaowu.pojo.Role;
import com.itxiaowu.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 *  此处实现从数据库中获取数据
 */
@Component
public class SpringSecurityUserService implements UserDetailsService {

    @Autowired
    private JedisPool jedisPool;     // ---> 此处进行封装缓存用户全部信息

    // 调用业务层获得对象及其权限信息
    @Reference
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        //1: 调用业务层获得user对象数据
        com.itxiaowu.pojo.User user = userService.findByUsername(username);
        //2: 判断是否存在
        if(user == null){
            return null;
        }

        /*
           缓存用户信息
         */
        Jedis jedis = jedisPool.getResource();
        if(jedis.get("user" +user.getUsername() ) == null){
            //0.1: 将user 对象数据转换为 json数据
            String userJson = new Gson().toJson(user);
            /*
                此处需要注意所存储数据可能会重复, 需要避免   尝试使用user + 用户名
             */
            jedis.set("user" + user.getUsername(),userJson);
        }
        jedis.close();

        //3: 存在则查询其存在的角色信息
            //用于封装用户的角色信息和权限
        List<GrantedAuthority> list = new ArrayList<>();

        Set<Role> roles = user.getRoles();

//        System.out.println("长度是:" + roles.size());

        if(roles == null || roles.size() == 0){
            return null;
        }

        //遍历获得所需要的职能信息  -
        for (Role role : roles) {

            // -> 角色关键字, 角色的标识符
            String keyword = role.getKeyword();
            // 为当前用户授予角色
            list.add(new SimpleGrantedAuthority(keyword));

            //4: 查询角色信息所拥有的许可能力
            //遍历当前角色对应的权限
            Set<Permission> permissions = role.getPermissions();
            //判断是否由数据
            if(permissions == null && permissions.size() == 0){
                return null;
            }
            for (Permission permission : permissions) {
                // 获得权限关键字
                String permissionKeyword = permission.getKeyword();
                // 添加权限信息
                list.add(new SimpleGrantedAuthority(permissionKeyword));

            }
        }
        //5: 进行对用户信息封装
        User userDetails = new User(username, user.getPassword(), list);

        //6: 返回数据
        return userDetails;
    }

    public static void main(String[] args) {
        // 将 object 对象转换为json格式 与反格式
        String userJ = new Gson().toJson(new com.itxiaowu.pojo.User("admin", "admin"));
        System.out.println("json 格式" + userJ);

        com.itxiaowu.pojo.User user = new Gson().fromJson(userJ, com.itxiaowu.pojo.User.class);
        System.out.println(user);

    }
}
